package com.houshuai.emqtt.threads;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class TestThread {
    public static void main(String[] args) {
        List<Object> list = new ArrayList<Object>(10000);
        list.add("mark");
        list.add("mario");
        list.add("mk");
        list.add("marks");
        list.add("marios");
        list.add("mks");
        list.add("marios");
        list.add("mks");
        list.add("marios");
        list.add("mks");
        list.add("marios");
        list.add("mks");
        // 每n条数据开启一条线程
        int threadSize = 5;
        // 总数据条数
        int dataSize = list.size();
        // 线程数
        int threadNum = dataSize / threadSize + 1;
        // 定义标记 dataSize / threadSize整除时(threadNum多了一次)
        boolean special = dataSize % threadSize == 0;
        //Executor是一个顶层接口，在它里面只声明了一个方法execute(Runnable)，返回值为void，参数为Runnable类型，从字面意思可以理解，就是用来执行传进去的任务的；
        //
        //　　然后ExecutorService接口继承了Executor接口，并声明了一些方法：submit、invokeAll、invokeAny以及shutDown等；
        //
        //　　抽象类AbstractExecutorService实现了ExecutorService接口，基本实现了ExecutorService中声明的所有方法；
        //
        //　　然后ThreadPoolExecutor继承了类AbstractExecutorService。
        ExecutorService ex = Executors.newFixedThreadPool(threadNum);
        // 返回结果对象集合
        List<Future<List<Object>>> futures = new ArrayList<>(threadNum);
        //分配
        for (int i = 0; i < threadNum; i++) {
            if (i == threadNum - 1) {
                if (special) {
                    break;
                }
                futures.add(ex.submit(new Task(list,threadSize * i,dataSize)));
            } else {
                futures.add(ex.submit(new Task(list,threadSize * i,threadSize * (i + 1))));
            }
        }
        try {
            //处理
            List<Object> result = new ArrayList<>();
            for(Future<List<Object>> future : futures){
                //如果任务没有完成则忙等待
//                while (!future.isDone());
                System.out.println(future.get());
                //合并操作
                result.addAll(future.get());
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //关闭线程池，不再接收新的任务
            ex.shutdown();
        }
    }
}
